package cn.gwm.utils;

import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

/**
 * @Author: liangguang
 * @Date: 2022/5/26
 * @Description: 基于 HuTool
 */
public class JsonHuToolUtil {

    private static JSONConfig jsonConfig;

    static {
        jsonConfig = new JSONConfig();
        // 不忽略 null
        jsonConfig.setIgnoreNullValue(false);
        jsonConfig.setOrder(true);
    }

    public static JSONConfig getJsonConfig() {
        return jsonConfig;
    }

    /**
     * 获取一个 严格顺序的 空json对象
     *
     * @return
     */
    public static JSONObject createObj(Boolean flag) {
        if (flag) {
            return JSONUtil.createObj(JsonHuToolUtil.getJsonConfig());
        }
        return JSONUtil.createObj();
    }


    /**
     * 将 bean 对象 转换为 JSONObect
     *
     * @param bean
     * @return
     */
    public static JSONObject beanToJSONObj(Object bean, JSONConfig jsonConfig) {
        JSONObject parseObj = JSONUtil.parseObj(JSONUtil.toJsonStr(bean, jsonConfig));
        return parseObj;
    }

    /**
     * 将 bean 对象 转换为 JSONObect  不忽略 null 值
     *
     * @param bean
     * @return
     */
    public static JSONObject beanToJSONObj(Object bean) {
        JSONObject parseObj = JSONUtil.parseObj(JSONUtil.toJsonStr(bean, jsonConfig));
        return parseObj;
    }

    /**
     * 将 JSONObject key 驼峰转下划线
     *
     * @param jsonObject
     * @param jsonConfig
     * @return
     */
    public static JSONObject obj2Underline(JSONObject jsonObject, JSONConfig jsonConfig) {
        JSONObject result = JSONUtil.createObj(jsonConfig);
        jsonObject.forEach((k, v) -> {
            result.set(StringUtil.humpToUnderline(k), v);
        });
        return result;
    }

    /**
     * 将 JSONObject key 驼峰转下划线 不忽略 null 值
     *
     * @param jsonObject
     * @return
     */
    public static JSONObject obj2Underline(JSONObject jsonObject) {
        JSONObject result = JSONUtil.createObj(jsonConfig);
        jsonObject.forEach((k, v) -> {
            result.set(StringUtil.humpToUnderline(k), v);
        });
        return result;
    }


    /**
     * 将 JSONObject key 下划线转驼峰
     *
     * @param jsonObject
     * @param jsonConfig
     * @return
     */
    public static JSONObject obj2Hump(JSONObject jsonObject, JSONConfig jsonConfig) {
        JSONObject result = JSONUtil.createObj(jsonConfig);
        jsonObject.forEach((k, v) -> {
            result.set(StringUtil.underlineToHump(k), v);
        });
        return result;
    }

    /**
     * 将 JSONObject key 下划线转驼峰 不忽略 null 值
     *
     * @param jsonObject
     * @return
     */
    public static JSONObject obj2Hump(JSONObject jsonObject) {
        JSONObject result = JSONUtil.createObj(jsonConfig);
        jsonObject.forEach((k, v) -> {
            result.set(StringUtil.underlineToHump(k), v);
        });
        return result;
    }

    /**
     * 对象转 字符串，并驼峰转下划线，且 保留null
     *
     * @param obj
     * @return
     */
    public static String obj2Underline(Object obj) {
        return JSONUtil.toJsonStr(obj2Underline(beanToJSONObj(obj)), jsonConfig);
    }

    /**
     * 对象转 字符串，下划线转驼峰，且 保留null
     *
     * @param obj
     * @return
     */
    public static String obj2Hump(Object obj) {
        return JSONUtil.toJsonStr(obj2Hump(beanToJSONObj(obj)), jsonConfig);
    }


}
